package cn.itcast.nio.c1;

import java.nio.ByteBuffer;

import static cn.itcast.nio.c1.ByteBufferUtil.debugAll;

public class TestByteBufferExam {
    public static void main(String[] args) {
        /*
            网络上有多条数据发送给服务端,数据之间使用 \n 进行分割
            但由于某种原因这些数据在接收时,被进行了重新组合,例如原始数据有3条为
            Hello,world\n
            I'm zhangSan\n
            How are you?\n
            变成下面的两个ByteBuff(黏包,半包)
            黏包的原因:客户端出于效率的考虑 将多条数据 合并 发送给服务器端
            半包的原因:受限于服务器端缓冲区的大小,假设一个缓冲区接收了一部分,剩下的考别的缓冲区来接收
            Hello,world\nI'm zhangSan\nHo
            w are you?\n
            现在要求你编写程序,将错乱的数据恢复成原始的按 \n 分割的数据
         */
        ByteBuffer source = ByteBuffer.allocate(32);
        source.put("Hello,world\nI'm zhangSan\nHo".getBytes());
        split(source);
        source.put("w are you?\n".getBytes());
        split(source);

    }
    public static void split(ByteBuffer source){
        source.flip();
        for (int i = 0;i<source.limit();i++){
            // 这里通过分隔符因为要遍历 效率相对较低
            if(source.get(i) == '\n'){
                // 把这条消息存入一个新的ByteBuffer
                int length = i + 1 - source.position();
                ByteBuffer target = ByteBuffer.allocate(length);
                // 从 source 读, 向 target 写
                for(int j = 0;j < length; j++){
                    target.put(source.get());
                }
                debugAll(target);
            }
        }
        source.compact();
    }
}
